package com.marmot.cloud.framework.orm.jpa.service;

import com.marmot.cloud.framework.core.pager.PageHelper;
import com.marmot.cloud.framework.core.response.PageData;
import com.marmot.cloud.framework.orm.jpa.entity.BaseJpaEntity;
import com.marmot.cloud.framework.orm.jpa.repository.BaseJpaCrudRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Optional;

/**
 * 通用 JPA CRUD 服务接口
 *
 * @param <M> 具体的存储库类型
 * @param <T> 实体类型，必须继承 BaseJpaEntity
 * @param <ID> 实体 ID 类型
 */
public interface BaseJpaCrudService<M extends BaseJpaCrudRepository<T, ID>, T extends BaseJpaEntity, ID> {

    /**
     * 保存实体
     *
     * @param t 要保存的实体
     * @return 保存后的实体
     */
    T save(T t);

    /**
     * 批量保存实体
     *
     * @param list 要保存的实体列表
     */
    void saveAll(List<T> list);

    /**
     * 根据 ID 删除实体
     *
     * @param id 实体的 ID
     */
    void delete(ID id);

    /**
     * 批量删除实体
     *
     * @param list 要删除的实体列表
     */
    void deleteAll(List<T> list);

    /**
     * 更新实体
     *
     * @param t 要更新的实体
     * @return 更新后的实体
     */
    T update(T t);

    /**
     * 批量更新实体
     *
     * @param list 要更新的实体列表
     */
    void updateAll(List<T> list);

    /**
     * 根据 ID 查找实体
     *
     * @param id 实体的 ID
     * @return 查找到的实体
     */
    Optional<T> findById(ID id);

    /**
     * 根据示例实体查找分页结果
     *
     * @param t 示例实体
     * @param pageable 分页参数
     * @return 分页结果
     */
    Page<T> findExample(T t, Pageable pageable);

    /**
     * 根据 PageHelper 查找分页结果
     *
     * @param pageHelper 分页帮助类，包含示例实体和分页参数
     * @return 分页结果
     */
    PageData<T> findExample(PageHelper<T> pageHelper);

    /**
     * 检查实体是否存在
     *
     * @param id 实体的 ID
     * @return 如果存在则返回 true，否则返回 false
     */
    boolean existsById(ID id);
}
